﻿
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
    string[,] str =
    {   // 名称，方法
        { "队列","QDecrypt"},
        { "栈","IsPalindrome"},
        { "链表","AddNum"},
        { "小猫钓鱼","t4" }
    };
    int index = 0;
}

<div class="layui-tab layui-tab-brief">
    <!-- table选项卡 -->
    <ul class="layui-tab-title title-pin">
        @{
            for (int i = 0; i < str.Length / 2; i++) {
                <li class="@(i==0?"layui-this":"")">@str[i, 0]</li>
            }
        }
    </ul>
    <!-- 内容 -->
    <div class="layui-tab-content">
        <!-- 队列 -->
        <div class="layui-tab-item layui-show">
            <blockquote class="layui-elem-quote ">
                <p><b>特点：</b>先进先出</p>
                <p><b>举例：</b>一串数是"6，3，1，7，5，8，9，2，4"</p>
                <p>
                    <b>规则：</b>首先将第 1个数删除，紧接着将第 2 个数放到
                    这串数的末尾，再将第 3 个数删除并将第 4 个数放到这串数的末尾，再将第 5 个数删除……
                </p>
                <p>直到剩下最后一个数，将最后一个数也删除。按照刚才删除的顺序，把这些删除的数连在一起</p>
            </blockquote>

            <blockquote class="layui-elem-quote layui-quote-nm">
                <b>思路：</b>
                建立一个队列，存入数据，第一个数据取出，并记录，第二个取出放至，队列末尾，队列为空时结束
            </blockquote>

            @* 测试文本框 *@
            @Html.Partial("_Input",
           new ViewDataDictionary { { "Url", Url.Action(str[index++, 1], "Struc") }, { "Title", "解密" } })

            <pre class="layui-code code" lay-title="C#">
        /// <summary>
        /// 队列解密
        /// </summary>
        /// < typeparam name="s">数组类型< /typeparam>
        /// <param name="arr">待解密数组< /param>
        /// <returns></returns>
        public s[] QueueDecrypt< s>(s[] arr) {
            // 创建队列
            Queue< s> q = new Queue< s>();
            // 循环将数据加入队列
            foreach (s item in arr)
                q.Enqueue(item);

            int index = 0;
            // 将数据取出
            while (q.Count > 0) {
                // 将第一条数据从队列取出，并放入数组
                arr[index++] = q.Dequeue();
                if (q.Count > 0)
                    // 将第二条数据放入队列末尾
                    q.Enqueue(q.Dequeue());
            }
            return arr;
        }
</pre>

        </div>
        <!-- 栈 -->
        <div class="layui-tab-item">
            <blockquote class="layui-elem-quote ">
                <p><b>特点：</b>先进后出</p>
                <p><b>举例：</b>一串字符"adminimda"</p>
                <p>
                    <b>规则：</b>第一个字符和最后一个字符相同，第二个和倒数第二个相同，以此类推，全部满足要求，即为回文
                </p>
            </blockquote>

            <blockquote class="layui-elem-quote layui-quote-nm">
                <b>思路：</b>
                将字符的一半入栈，然后依次取出与原字符从后向前比较，全部相同即为回文

            </blockquote>

            @* 测试文本框 *@
            @Html.Partial("_Input",
           new ViewDataDictionary { { "Url", Url.Action(str[index++, 1], "Struc") }, { "Title", "判断" }, { "Des", "输入任意字符串" } })

            <pre class="layui-code">
        /// <summary>
        /// 判断是否为回文
        /// </summary>
        /// <param name="input">待判断字符串< /param>
        public void IsPalindrome(string input) {

            Stack< char> stack = new Stack< char>();
            string msg = "";

            // 字符串的一半入栈
            for (int i = 0; i < input.Length / 2; i++) {
                stack.Push(input[i]);
            }
            // 字符串最后一个值的索引
            int index = input.Length - 1;
            // 依次出栈
            while (stack.Count > 0) {
                // 若有不同的字符，结束出栈
                if (input[index--] != stack.Pop())
                    break;
            }
            // 若index的大小不是字符串长度的一半
            if (index != input.Length / 2) 
                msg = input + "，不是回文！";
            else
                msg = input + "，是回文！";
        }
</pre>

        </div>
        <!-- 链表 -->
        <div class="layui-tab-item">
            <blockquote class="layui-elem-quote ">
                <p><b>特点：</b>允许插入和移除任意位置节点，但不能随机存取</p>
                <p><b>举例：</b>一段已经排序完毕的数字"0，1，2，3，4，5，7，8，9"</p>
                <p>
                    <b>规则：</b>将数字"6"插入至正确位置
                </p>
            </blockquote>

            <blockquote class="layui-elem-quote layui-quote-nm">
                <b>思路：</b>
                使用数组的话，需要移动其它数据，数据量庞大就呵呵，链表只需要改变一个节点
            </blockquote>

            @* 测试文本框 *@
            @Html.Partial("_Input",
           new ViewDataDictionary { { "Url", Url.Action(str[index++,1], "Struc") }, { "Title", "判断" },
               { "Des", "输入两组数字，分号分割，每组数字以逗号分割，第一组从小到大排列完毕，第二组为待插入数字" } })

            <pre class="layui-code">
        /// <summary>
        /// 链表按顺序插入数字
        /// </summary>
        /// <param name="arr">已排序数组< /param>
        /// <param name="num">待插入数组< /param>
        public double[] LinkListAdd(double[] arr, double[] num) {

            LinkedList< double> link = new LinkedList< double>();

            // 将排序完毕的数组加入链表
            foreach (var item in arr)
                link.AddLast(item);

            // 将num按从小到大的顺序插入链表
            foreach (var item in num) {
                // 获取第一个节点
                LinkedListNode< double> now = link.First;
                // 寻找值比item大的节点
                while (now != null && now.Value < item)
                    now = now.Next;
                // 找遍整个链表，没有比item更大的
                if (now == null)
                    link.AddLast(item);
                else {
                    now = now.Previous;
                    // 找遍整个链表，没有比item更小的
                    if (now == null)
                        link.AddFirst(item);
                    // 将item插入指定位置
                    else
                        link.AddAfter(now, new LinkedListNode< double>(item));
                }
            }
            return link.ToArray();
        }
</pre>

        </div>
        <!-- 小猫钓鱼 -->
        <div class="layui-tab-item">
            <blockquote class="layui-elem-quote ">
                <p>
                    <b>规则：</b>将一副扑克牌平均分成两份，每人拿一份。（只有1~9）
                    <br />小哼先拿出手中的第一张扑克牌放在桌上，然后小哈也拿出手中的第一张扑克牌，并放在小哼刚打出的扑克牌的上面，就像这样两人交替出牌。
                    <br />出牌时，如果某人打出的牌与桌上某张牌的牌面相同，即可将两张相同的牌及其中间所夹的牌全部取走，并依次放到自己手中牌的末尾。
                    <br />当任意一人手中的牌全部出完时，游戏结束，对手获胜。
                </p>
            </blockquote>

            <blockquote class="layui-elem-quote layui-quote-nm">
                <b>思路：</b>
                将拿在手上的牌视为队列，在桌上的牌视为栈
            </blockquote>

            @* 测试文本框 *@
            @Html.Partial("_Input",
           new ViewDataDictionary { { "Url", Url.Action(str[index++,1], "Struc") }, { "Title", "判断" },
               { "Des", "输入两组数字，分号分割，每组数字以逗号分割，[1,9]，例：1，2，3；3，2，1" } })

            <pre class="layui-code">

</pre>

        </div>
    </div>
</div>
